#ifndef __COMMON_HPP__
#define __COMMON_HPP__

#include <cstdio>
#include <cstdlib>
#include <climits>
//#include <ctypes.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <getopt.h>

#include <set>
#include <map>
#include <vector>
#include <iostream>
#include <string>
#include <sstream>

#include "utils/utils.hpp"
#include "ipc/ipc.hpp"

#ifndef PERMITS
	#define PERMITS 0666
#endif
#ifndef MAX_LLENADORAS
	#define MAX_LLENADORAS 5
#endif

// Para simplificar la creacion de objetos IPC.
enum botellas { VACIAS = 1, LLENAS, TAPADAS, ETIQUETADAS, LISTAS };
enum maquinas { LLENADORA = 8, TAPADORA, ETIQUETADORA, TRANSPORTADORA_A };

// Marca de que corresponde a un semaforo mutex.
#define MUTEX 64
// Marca de que corresponde a una variable compartida utilizada como contador.
#define COUNTER 128
// Marca de que corresponde a una cola de mensajes.
#define MSG_QUEUE 192

enum eEstado { VACIA, LLENA, TAPADA, ETIQUETADA, COMPLETA };

typedef struct {
	long tipo;
	eEstado estado;
} sBotella;

// Representación del pedido de un recurso dado.
enum eRecurso { NINGUNO, BOTELLA, JUGO, TAPA, ETIQUETA };
typedef struct {
	long tipo;
	long estacion;
	eRecurso recurso;
} sPedido;

// Discriminantes para los tipos de mensajes utilizados en las colas.
enum eMensajeTipo { CUALQUIERA = 0, SBOTELLA_TIPO, SRECURSO_TIPO, SESTACION_0 = 128 };


inline key_t my_ftok(int value) {
	return ftok(BASE_NAME,value);
//	key_t k = ftok(BASE_NAME,value);
//	if (k == (key_t)-1)
//		throw ipc::exception("ftok");
}

static utils::logger_stream logger (stdout);
static utils::logger_stream error (stderr,' ',"\033[1;31m");
//static utils::no_log logger;

#define nl utils::nl

#endif /* __COMMON_HPP__ */

